#ifndef __USERID_MANAGE_H__
#define __USERID_MANAGE_H__

/**
 * @brief id分配标识枚举
 *
 */
typedef enum
{
    ADDRESS_RESERVED = 0, /**< 未分配 */
    ADDRESS_PREALLOCATED, /**< 已分配 */
    ADDRESS_USING,        /**< 正在使用 */
} allocate_flag_e;

/**
 * @brief ID管理地址配置结构体
 *
 */
typedef struct
{
    unsigned int assign_start_addr; /**< 分配起始地址 */
    unsigned int assign_end_addr;   /**< 分配结束地址 */
    unsigned int addr_num;          /**< 平铺的ID个数 */
} id_manager_cfg_t;

/**
 * @brief 地址管理结构体
 *
 */
typedef struct manager_address
{
    unsigned char allocate_flag; /**< id分配标识 */
    unsigned char burst_idx;     /**< id的burst idx */
    unsigned char slot_idx;      /**< id的slot idx */
    unsigned char rach_delay;    /**< 接入delay，和终端距网关的距离有关，子帧模式使用 */
    unsigned short time_slot_fn;  /**< id的分时发送时隙号 */
    unsigned short wiota_id;     /**< 表示WIoTa id */
    unsigned int dev_id;         /**< 表示WIoTa的鉴权id，根据该id重新分配一个WIoTa id */
    unsigned int last_fn_index;  /**< 上一次记录的帧号，用于判断是否需要连续唤醒 */
    unsigned int fn_index;       /**< 终端通过同步paging方式睡眠的帧号，用于远程唤醒终端 */
} manager_address_t;

/**
 * @brief id管理初始化
 *
 * @param id_mng_cfg 地址管理配置
 * @return int       0:成功，其他:失败
 */
int manager_wiota_userid_init(id_manager_cfg_t *id_mng_cfg);

/**
 * @brief id管理反初始化
 *
 */
void manager_wiota_userid_deinit(void);

/**
 * @brief 根据IoTE的设备id重新分配一个用于鉴权后通讯的WIoTa id
 *
 * @param dev_address          终端的dev id
 * @return manager_address_t*  地址管理结构体指针
 */
manager_address_t *manager_reallocated_wiota_id(unsigned int dev_address);

/**
 * @brief 通过WIoTa id查询该id是否存在于管理链表中
 *
 * @param wiota_id            终端的WIoTa id
 * @return manager_address_t* 存在返回节点地址，不存在返回RT_NULL
 */
manager_address_t *manager_query_reserve_addr_by_wiota_id(unsigned int wiota_id);

/**
 * @brief 通过dev id查询该id是否存在于管理链表中
 *
 * @param dev_id              终端的dev id
 * @return manager_address_t* 存在返回节点地址，不存在返回RT_NULL
 */
manager_address_t *manager_query_reserve_addr_by_dev_id(unsigned int dev_id);

/**
 * @brief 通过一个dev id查询对应的WIoTa id
 *
 * @param dev_id        终端的dev id
 * @return unsigned int 存在返回该WIoTa id，不存在返回0
 */
unsigned int manager_query_wiota_id_by_dev_id(unsigned int dev_id);

/**
 * @brief 通过一个WIoTa id查询对应的dev id
 *
 * @param wiota_id      终端的WIoTa id
 * @return unsigned int 存在返回dev id，不存在返回0
 */
unsigned int manager_query_dev_id_by_wiota_id(unsigned int wiota_id);

/**
 * @brief 获取已分配的id个数
 *
 * @return unsigned int
 */
unsigned int manager_get_reallocated_num(void);

/**
 * @brief 获取上行子帧个数
 *
 * @return unsigned int 上行子帧个数
 */
unsigned int manager_get_ul_subframe_num(void);

/**
 * @brief 获取帧长
 *
 * @return unsigned int 帧长
 */
unsigned int manager_get_frame_len(void);

/**
 * @brief 获取实际分配的id总个数
 *
 * @return unsigned int
 */
unsigned int manager_get_actually_num(void);

#endif /* __USERID_MANAGE_H__ */